/**
 * The contents of this file are subject to the OpenMRS Public License
 * Version 1.0 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at
 * http://license.openmrs.org
 *
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
 * License for the specific language governing rights and limitations
 * under the License.
 *
 * Copyright (C) OpenMRS, LLC.  All Rights Reserved.
 */
package org.openmrs.module.datalogging.handler.event;

import org.openmrs.module.datalogging.filter.FilterFactory;

import java.util.HashSet;
import java.util.Set;


/**
 *
 */
public abstract class OpenmrsEventHandler implements EventHandler {
	
	/**
	 * All property for the object that can be filtered for encounter, the list will contains
	 * location and encounter type for obs, the list will contains concept, coded value, encounter
	 */
	protected Set<String> filters;
	
	/**
	 */
	public OpenmrsEventHandler() {
		registerFilters();
	}
	
	/**
	 * Get all supported filters for the particular variable
	 * 
	 * @return all supported filters for the variable
	 */
	public Set<String> getSupportedFilters() {
		if (filters == null)
			filters = new HashSet<String>();
		return filters;
	}
	
	/**
	 * Prepare a list of supported filters for each variable. Subclass must implements this method
	 * to tell the system what filter supported by the variable
	 */
	protected abstract void registerFilters();
	
	/**
	 * Register a new filter name to the list of all available filters
	 * 
	 * @param filterName filter name that will be registered
	 */
	protected void registerFilter(String filterName) {
		getSupportedFilters().add(filterName);
	}
	
	/**
	 * Method to check whether a filter name is supported by the variable type or not
	 *
	 * @param filterName the filter name to be checked
	 * @return true if the variable type support filtering on the filter name field
	 */
	public boolean supportFilter(String filterName) {
		return getSupportedFilters().contains(filterName) && handlerExist(filterName);
	}
	
	/**
	 * @param filterName
	 * @return
	 */
	private boolean handlerExist(String filterName) {
		return (FilterFactory.getHandler(filterName) != null);
	}
}
